import json
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData
from sqlalchemy.orm import sessionmaker

def json_to_database(json_file_path, db_connection_string, table_name):
    """
    将JSON文件中的数组数据导入到数据库
    
    参数:
    json_file_path: JSON文件路径
    db_connection_string: 数据库连接字符串
    table_name: 要插入的表名
    """
    # 1. 读取JSON文件
    with open(json_file_path, 'r', encoding='utf-8') as f:
        data = json.load(f)
    
    # 确保数据是一个数组
    if not isinstance(data, list):
        raise ValueError("JSON文件内容必须是一个数组")
    
    if not data:
        print("JSON文件中没有数据")
        return
    
    # 2. 连接数据库
    engine = create_engine(db_connection_string)
    Session = sessionmaker(bind=engine)
    session = Session()
    metadata = MetaData()
    
    # 3. 动态创建表（根据JSON数据的第一个元素结构）
    # 注意：这里假设所有元素结构相同，且值类型为基本类型
    first_item = data[0]
    columns = []
    
    for key, value in first_item.items():
        # 根据值类型选择合适的SQL列类型
        if isinstance(value, int):
            col_type = Integer
        else:  # 默认为字符串类型
            col_type = String(255)
        
        columns.append(Column(key, col_type, primary_key=(key == 'id')))
    
    # 创建表
    target_table = Table(table_name, metadata, *columns)
    metadata.create_all(engine)  # 如果表不存在则创建
    
    # 4. 插入数据
    try:
        # 批量插入
        from sqlalchemy.dialects.mysql import insert

        # 构建插入语句，遇到重复主键时忽略
        insert_stmt = insert(target_table).values(data)
        on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update(
            # 主键重复时不做任何操作（MySQL特有的语法）
            id=insert_stmt.inserted.id
        )
        session.execute(on_duplicate_key_stmt)
        session.commit()
        print(f"成功导入 {len(data)} 条数据到表 {table_name}")
    except Exception as e:
        session.rollback()
        print(f"导入数据时出错: {str(e)}")
    finally:
        session.close()

if __name__ == "__main__":
    # 配置信息 - 请根据实际情况修改
    JSON_FILE = "issueListData.json"  # JSON文件路径
    DB_CONN_STR = "mysql+pymysql://root:!Admin1234@localhost:3306/mysql"
    # 其他数据库连接字符串示例:
    # PostgreSQL: "postgresql://username:password@localhost/dbname"
    # SQLite: "sqlite:///mydatabase.db"
    # SQL Server: "mssql+pyodbc://username:password@dsn_name"
    
    TABLE_NAME = "issue"  # 目标表名
    
    # 执行导入
    json_to_database(JSON_FILE, DB_CONN_STR, TABLE_NAME)
